<?php  if (!defined('BASEPATH')) exit('No direct script access allowed');

/**
 * Помощник-виджет для отрисовки меню
 *
 * @package CoreFramework
 * @version 1.0
 * @author Gennadiy Kozlenko
 */

/**
 * Отрисовка виджета
 * 
 * @access public
 * @param string $str
 * @return string
 */
function menu_widget($params = array()) {
   $obj =& get_instance();
   $output = '';
   // Получаем идентификатор меню
   $name = $params['name'];
   $obj->benchmark->mark('process_menu_(_' . $name . '_)_start');
   $id_menu = 0;
   $obj->load->model('m_table');
   $obj->m_table->set_table('menus');
   $obj->m_table->add_restriction('name', $name);
   $obj->m_table->load_results();
   if (0 < $obj->m_table->get_count()) {
      $result = $obj->m_table->next_result();
      $id_menu = $result['id_menu'];
   }
   // Получаем идентификатор текущего элемента меню и его родительский элемент
   $obj->load->model('m_content');
   $id_content = null;
   if (isset($params['id'])) {
      $id_content = (int) $params['id'];
   }
   $parent = array();
   $id_parent = null;
   if (0 == $id_content) {
      $id_content = null;
   } else {
      // Проверяем элемент меню на принадлежность самому меню
      $obj->m_content->set_id($id_content);
      if ($id_menu == $obj->m_content->get('id_menu')) {
         $id_parent = $obj->m_content->get('id_parent');
      } else {
         $id_content = null;
      }
   }
   // Получаем parent элемент
   $parent = array();
   // Получаем список элементов
   $results = array();
   // Если имеется сабменю, выводим его
   $obj->m_table->set_table('contents');
   $obj->m_table->add_restriction('id_menu', $id_menu);
   $obj->m_table->add_restriction('id_parent', $id_content);
   $obj->m_table->add_restriction('status', 'active');
   $obj->m_table->add_sort('position');
   $obj->m_table->load_results();
   if (0 < $obj->m_table->get_count()) {
      $results = $obj->m_table->get_results();
      if (null !== $id_content) {
         $obj->m_content->set_id($id_content);
         $parent = array(
            'title' => htmlspecialchars($obj->m_content->get('title')),
            'link'  => $obj->m_content->get_url(),
         );
      }
   } else {
      // В противном случаем выводим меню, содержащее текущий элемент
      $obj->m_table->clean();
      $obj->m_table->add_restriction('id_menu', $id_menu);
      $obj->m_table->add_restriction('id_parent', $id_parent);
      $obj->m_table->add_restriction('status', 'active');
      $obj->m_table->add_sort('position');
      $obj->m_table->load_results();
      $results = $obj->m_table->get_results();
      if (null !== $id_parent) {
         $obj->m_content->set_id($id_parent);
         $parent = array(
            'title' => htmlspecialchars($obj->m_content->get('title')),
            'link'  => $obj->m_content->get_url(),
         );
      }
   }
   $items = array();
   $obj->load->helper('content');
   foreach ($results as $result) {
      $item = array(
         'title'    => $result['title'],
         'link'     => get_url($result),
         'selected' => $result['id_content'] == $id_content ? array(array()) : array(),
         'first'    => array(),
         'last'     => array()
      );
      array_push($items, $item);
   }
   reset($items);
   $item = array_shift($items);
   $item['first'] = array(array());
   array_unshift($items, $item);
   $item = array_pop($items);
   $item['last'] = array(array());
   array_push($items, $item);
   
   $data = array(
      'items'  => $items,
      'parent' => 0 < count($parent) ? array($parent) : array()
   );
   $output = $obj->parser->parse('widgets/menu/' . $name . '.html', $data, true);
   $obj->benchmark->mark('process_menu_(_' . $name . '_)_end');
   return $output;
} // end menu_widget
